package cn.minhx.lab.design_patterns.singleton.f1;

public class SafetySingleton {

    // 使用 volatile 修饰，DCL下能及时更新
    private static volatile SafetySingleton instance;

    private SafetySingleton() {
        try {
            // 阻塞1s，方便多线程测试
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

    public static SafetySingleton getInstance() {
        // 第一重检测
        if (null == instance) {
            // 加锁
            synchronized (SafetySingleton.class) {
                // 第二重检测，防止同时进入第一重检测（synchronized 是一种可重入锁）
                if (null == instance) {
                    instance = new SafetySingleton();
                }
            }
        }

        return instance;
    }

    public static SafetySingleton getInstance2() {
        // 第一重检测
        if (null != instance) {
            return instance;
        }
        // 加锁
        synchronized (SafetySingleton.class) {
            // 第二重检测，防止同时进入第一重检测（synchronized 是一种可重入锁）
            if (null == instance) {
                instance = new SafetySingleton();
            }
            return instance;
        }
    }


}
